Jak naplnit MemoryStream pomoci DLL?
Otázka od:  little_bobes@centrum.cz
1. 7. 2004 7:49
Zdravim,
zacal jsem si hrat s knihovnami, lepe receno chci svou aplikaci rozsekat na
knihovny.
Ale ted jsem narazil na %subject%.
V hlavnim programu jsem si vytvoril TMemoryStream, ktery chci v DLL necim
naplnit a ve sve aplikaci chci s temito daty dale pracovat.
Vyzkousel jsem variantu i s runtime balicky, ale stale je nekde chyba.
hlavni program:
type
    TMemStr = ^TMemoryStream;
    TAKC = procedure (Output: TMemStr);
...
type
  TForm1 = class(TForm)
  private
    AKC: TAKC;
  end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  Hendl: THandle;
  pomRes: TMemoryStream;
begin
        Hendl := MyLoadLibrary;
        If Hendl <> 0 then
        begin
          @AKC := GetProcAddress(Hendl, PChar('AKC'));
          try
            pomRes := TMemoryStream.Create;
            If @AKC <> nil then AKC(@pomRes);
            if pomRes.Size > 0 then ShowMessage(IntToStr(pomRes.Size));
          finally
            FreeAndNil(pomRes);
            FreeLibrary(Hendl);
          end;
        end;
end;
DLL:
type
  TMemStr = ^TMemoryStream;
...
procedure AKC(Output: TMemStr); stdcall;
begin
   ...
    Output^.Clear;  // access violation
    ...
end;
Poradite mi nekdo, v cem by mohla byt chyba nebo jak mam predavat ruzne
parametry do/z knihoven, abych nemusel runtime balicky pouzivat, pripadne
nejaky odkaz na net, kde by toto bylo obsahleji popsano?
Predem dekuji
Bob
(D4 c/s, FB 1.5)
Odpovedá:  Daniel Rott
1. 7. 2004 8:26
> V hlavnim programu jsem si vytvoril TMemoryStream, ktery chci
> v DLL necim naplnit a ve sve aplikaci chci s temito daty dale pracovat.
Udelal bych to tak, ze hlavni aplikace by funkci v DLL predala adresu sve
procedury na zapis do streamu. Tato funkce by mela za parametry pointer a
pocet bajtu, funkce v DLL by jen ukazala na data ktera chce zapsat a zapsala
by si je sama aplikace => nebudou problemy s memory managerem, bude to
fungovat i bez balicku.
Daniel
---------------------------------------------------------------
Scanning complete: NO intelligent life form in range.
Odpovedá:  Ondrej Kelle
1. 7. 2004 8:57
> hlavni program:
> type
>     TMemStr = ^TMemoryStream;
>     TAKC = procedure (Output: TMemStr);
Chyba Ti tam direktiva stdcall;
Objekty su pointre, takze staci predavat rovno TMemoryStream, nemusis
deklarovat TMemStr.
HTH
TOndrej